API: Add gdk_window_get_background_pattern()
authorBenjamin Otte <otte@redhat.com>
Sun, 15 Aug 2010 21:50:02 +0000 (23:50 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 16 Aug 2010 17:48:46 +0000 (19:48 +0200)
This is the suggested way for GTK3 to store a Window's background so it
makes sense to use the same function today already.

docs/reference/gdk/gdk3-sections.txt
gdk/gdk.symbols
gdk/gdkinternals.h
gdk/gdkwindow.c
gdk/gdkwindow.h

index eb3bf36a0c3ab6b9c399ae00e9fb178d62ed4889..de08736efdd6d91949c8597ffb7c96a86b30c581 100644 (file)
@@ -477,9 +477,8 @@ gdk_window_merge_child_input_shapes
 gdk_window_set_static_gravities
 gdk_window_set_title
 gdk_window_set_background
-gdk_window_get_background
 gdk_window_set_back_pixmap
-gdk_window_get_back_pixmap
+gdk_window_get_background_pattern
 GDK_PARENT_RELATIVE
 gdk_window_set_cursor
 gdk_window_get_cursor
index 8a582433e8ccc01f79f4b52fc257a4acae7cfacf..27f8f6a8af276e6d194e7286297225cbf2d3d4b8 100644 (file)
@@ -579,6 +579,7 @@ gdk_window_move_resize
 gdk_window_scroll
 gdk_window_move_region
 gdk_window_get_accept_focus
+gdk_window_get_background_pattern
 gdk_window_get_composited
 gdk_window_get_cursor
 gdk_window_get_focus_on_map
index 694391d83c1bf910a791e46d2722647d70fad93a..dcd6e128fe282b1d5f7b812d7c0b4c834a428238 100644 (file)
@@ -209,6 +209,7 @@ struct _GdkWindowObject
 
   GdkColor bg_color;
   GdkPixmap *bg_pixmap;
+  cairo_pattern_t *background;
   
   GSList *paint_stack;
   
index d5bc413dfa470d2737d9255b962cacefb771ab26..e7380c69cf2c492f9f0cc23b86b32745a085ae7b 100644 (file)
@@ -2067,6 +2067,12 @@ _gdk_window_destroy_hierarchy (GdkWindow *window,
              private->bg_pixmap = NULL;
            }
 
+          if (private->background)
+            {
+              cairo_pattern_destroy (private->background);
+              private->background = NULL;
+            }
+
          if (private->window_type == GDK_WINDOW_FOREIGN)
            g_assert (private->children == NULL);
          else
@@ -7085,6 +7091,12 @@ gdk_window_set_background (GdkWindow      *window,
 
   private->bg_pixmap = NULL;
 
+  if (private->background)
+    {
+      cairo_pattern_destroy (private->background);
+      private->background = NULL;
+    }
+
   if (!GDK_WINDOW_DESTROYED (window) &&
       gdk_window_has_impl (private) &&
       !private->input_only)
@@ -7145,6 +7157,12 @@ gdk_window_set_back_pixmap (GdkWindow *window,
       private->bg_pixmap != GDK_NO_BG)
     g_object_unref (private->bg_pixmap);
 
+  if (private->background)
+    {
+      cairo_pattern_destroy (private->background);
+      private->background = NULL;
+    }
+
   if (parent_relative)
     private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
   else if (pixmap)
@@ -7161,6 +7179,56 @@ gdk_window_set_back_pixmap (GdkWindow *window,
     }
 }
 
+/**
+ * gdk_window_get_background_pattern:
+ * @window: a window
+ *
+ * Gets the pattern used to clear the background on @window. If @window
+ * does not have its own background and reuses the parent's, %NULL is
+ * returned and you'll have to query it yourself.
+ *
+ * Returns: The pattern to use for the background or %NULL to use the
+ * parent's background.
+ *
+ * Since: 2.22
+ **/
+cairo_pattern_t *
+gdk_window_get_background_pattern (GdkWindow *window)
+{
+  GdkWindowObject *private = (GdkWindowObject *) window;
+
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  if (private->background == NULL)
+    {
+      if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG)
+        private->background = NULL;
+      else if (private->bg_pixmap != GDK_NO_BG &&
+               private->bg_pixmap != NULL)
+        {
+          static cairo_user_data_key_t key;
+          cairo_surface_t *surface;
+
+          surface = _gdk_drawable_ref_cairo_surface (private->bg_pixmap);
+          private->background = cairo_pattern_create_for_surface (surface);
+          cairo_surface_destroy (surface);
+
+          cairo_pattern_set_extend (private->background, CAIRO_EXTEND_REPEAT);
+          cairo_pattern_set_user_data (private->background,
+                                       &key,
+                                       g_object_ref (private->bg_pixmap),
+                                       g_object_unref);
+        }
+      else
+        private->background =
+            cairo_pattern_create_rgb (private->bg_color.red   / 65535.,
+                                      private->bg_color.green / 65535.,
+                                      private->bg_color.blue / 65535.);
+    }   
+
+  return private->background;
+}
+
 static void
 update_cursor_foreach (GdkDisplay           *display,
                        GdkDevice            *device,
index 77523c442b97f0cf35bd3409b2392250fff24440..dcc42acdf9fb28092edd1fe7db7776936d76f945 100644 (file)
@@ -693,6 +693,8 @@ void              gdk_window_set_background  (GdkWindow       *window,
 void         gdk_window_set_back_pixmap (GdkWindow       *window,
                                          GdkPixmap       *pixmap,
                                          gboolean         parent_relative);
+cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow     *window);
+
 void         gdk_window_set_cursor      (GdkWindow       *window,
                                          GdkCursor       *cursor);
 GdkCursor    *gdk_window_get_cursor      (GdkWindow       *window);